
/******************** item_27: 尽量少做转型动作 ************************/

// 3种不同的转型形式
// 1. C 风格的转型动作
// （T）expression      // 将 expression 转型为 T
// 2. 函数风格的转型动作
// T(expression)        // 将 expression 转型为 T
// 以上两种形式称为 "旧式转型"

// C++ 还提供 4 种新式转型（常常被称为new-style 或 C++-style casts）：
const_cast<T>(expression)
dynamic_cast<T>(expression)
reinterpret_cast<T>(expression)
static_cast<T>(expression)

// const_cast 通常被用来将对象的常量性转除。它也是唯一有此能力的 C++-style 转型操作符。
// dynamic_cast 主要用来执行 "安全向下转型"，也就是用来决定某对象是否归属继承体系中的某个类型。它是唯一无法由旧式语法执行的动作，也是唯一可能耗费
// 重大运行成本的转型动作。
// reinterpret_cast 意图执行低级转型，实际动作（及结果）可能取决于编译器，这也就表示它不可移植。例如将一个 pointer to int 转型为一个 int。这一
// 类转型在低级代码以外很少见。
// static_cast 用来强迫隐式转换，例如将 non-const 对象转为 const 对象，或将 int 转为 double 等等。它也可以用来执行上述多种转换的反向转换，例如
// 将 void* 指针转为 typed 指针，将 pointer-to-base 转为 pointer-to-derived。但它无法将 const 转为 non-const --- 这个只有 const_cast才办得到。

// 总结：
// 1. 如果可以，尽量避免转型，特别是在注重效率的代码中避免 dynamic_casts。如果有个设计需要转型动作，试着发展无需要转型的替代设计。
// 2. 如果转型是必要的，试着将它隐藏于某个函数背后。客户随后可以调用该函数，而不需要将转型放进他们自己的代码内。
// 3. 宁可使用 C++-Style（新式）转型，不需要使用旧式转型。前者很容易辨别出来，而且也比较有着分门别类的职掌。